#!/bin/bash
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

# if git rev-parse --verify HEAD >/dev/null 2>&1
# then
# 	against=HEAD
# else
# 	# Initial commit: diff against an empty tree object
# 	against=$(git hash-object -t tree /dev/null)
# fi
# 
# # If you want to allow non-ASCII filenames set this variable to true.
# allownonascii=$(git config --type=bool hooks.allownonascii)
# 
# # Redirect output to stderr.
# exec 1>&2
# 
# # Cross platform projects tend to avoid non-ASCII filenames; prevent
# # them from being added to the repository. We exploit the fact that the
# # printable range starts at the space character and ends with tilde.
# if [ "$allownonascii" != "true" ] &&
# 	# Note that the use of brackets around a tr range is ok here, (it's
# 	# even required, for portability to Solaris 10's /usr/bin/tr), since
# 	# the square bracket bytes happen to fall in the designated range.
# 	test $(git diff --cached --name-only --diff-filter=A -z $against |
# 	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
# then
# 	cat <<\EOF
# Error: Attempt to add a non-ASCII file name.
# 
# This can cause problems if you want to work with people on other platforms.
# 
# To be portable it is advisable to rename the file.
# 
# If you know what you are doing you can disable this check using:
# 
#   git config hooks.allownonascii true
# EOF
# 	exit 1
# fi
# 
# # If there are whitespace errors, print the offending file names and fail.
# exec git diff-index --check --cached $against --

# Run the rust formatter

exe="$(which rustfmt)"
echo "Running rustfmt precommit $exe..."

git_repo="$(git rev-parse --show-toplevel)"

echo "For git repo: $git_repo..."

if [ -n "$exe" ]; then
    # field separator to the new line
    IFS=$'\n'

    for line in $(git status -s); do
        # if added or modified
        if [[ "$line" == 'A'* || "$line" == 'M'* ]]; then
	    if [[ "${line:3}" == "crates/spacetimedb-core/src/messages.rs" ]]; then
	       echo "Skipping format for messages.rs..."
	       continue
	    fi
	    if [[ "${line:3}" == crates/spacetimedb-core/src/protobuf/*.rs ]]; then
	       echo "Skipping format for protobuf output..."
	       continue
	    fi

            # check file extension
            if [[ "$line" == *.rs ]]; then
		echo "Formatting changed file: ${line:3}..."
                # format file
                rustfmt --edition 2021 "$git_repo/${line:3}"	      
                # add changes
                git add "$git_repo/${line:3}"
            fi
        fi
    done

else
    echo "rustfmt was not found"
fi
